package _8_Gorm框架老郭

import (
	"gorm.io/gorm"
	"time"
)

// GORM 定义一个 gorm.Model 结构体
type Model struct {
	ID        uint `gorm:"primaryKey"`
	CreatedAt time.Time
	UpdatedAt time.Time
	DeletedAt gorm.DeletedAt `gorm:"index"`
}

// 字段级权限控制
// 可导出的字段在使用 GORM 进行 CRUD 时拥有全部的权限，此外，GORM 允许您用标签控制字段级别的权限。
// 这样您就可以让一个字段的权限是只读、只写、只创建、只更新或者被忽略
type User struct {
	Name0 string `gorm:"<-:create"`          // 允许读和创建
	Name1 string `gorm:"<-:update"`          // 允许读和更新
	Name2 string `gorm:"<-"`                 // 允许读和写（创建和更新）
	Name3 string `gorm:"<-:false"`           // 允许读，禁止写
	Name4 string `gorm:"->"`                 // 只读（除非有自定义配置，否则禁止写）
	Name5 string `gorm:"->;<-:create"`       // 允许读和写
	Name6 string `gorm:"->:false;<-:create"` // 仅创建（禁止从 db 读）
	Name7 string `gorm:"-"`                  // 通过 struct 读写会忽略该字段
	Name8 string `gorm:"-:all"`              // 通过 struct 读写、迁移会忽略该字段
	Name9 string `gorm:"-:migration"`        // 通过 struct 迁移会忽略该字段
}

// GORM 约定使用 CreatedAt、UpdatedAt 追踪创建/更新时间。如果您定义了这种字段，GORM 在创建、更新时会自动填充 当前时间
// 要使用不同名称的字段，您可以配置 autoCreateTime、autoUpdateTime 标签
// 如果您想要保存 UNIX（毫/纳）秒时间戳，而不是 time，您只需简单地将 time.Time 修改为 int 即可
type Userl struct {
	CreatedAt time.Time // 在创建时，如果该字段值为零值，则使用当前时间填充
	UpdatedAt int       // 在创建时该字段值为零值或者在更新时，使用当前时间戳秒数填充
	Updated0  int64     `gorm:"autoUpdateTime:nano"`  // 使用时间戳填纳秒数充更新时间
	Updated1  int64     `gorm:"autoUpdateTime:milli"` // 使用时间戳毫秒数填充更新时间
	Created   int64     `gorm:"autoCreateTime"`       // 使用时间戳秒数填充创建时间
}

// 创建表对应的结构体
type Book struct {
	ID           uint   `gorm:"primaryKey"`
	Title        string `gorm:"type:varchar(100);unique;not null"`
	Price        int64
	Is_publish   byte `gorm:"default:1"`
	Publish_date *time.Time
	CreateTime   *time.Time `gorm:"autoCreateTime"`
	UpdateTime   *time.Time `gorm:"autoCreateTime"`
}
